home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus Special 23 / AMIGAplus Sonderheft 23 (2000)(Falke)(DE)[!].iso / Updates / Datatypes / PCD-DT / Source / libbase.c < prev    next >
C/C++ Source or Header  |  1999-11-14  |  3KB  |  190 lines

  1. #include <clib/alib_protos.h>
  2. #include <pragma/exec_lib.h>
  3. #include <pragma/intuition_lib.h>
  4. #include <dos/dos.h>
  5. #include <exec/resident.h>
  6.  
  7. #define VERSION 43
  8. #define REVISION 12
  9.  
  10. struct ClassBase:Library
  11. {
  12. BPTR cb_SegList;
  13. IClass *cb_Class;
  14. SignalSemaphore cb_Lock;
  15. };
  16.  
  17. extern APTR Dispatcher;
  18. extern ULONG InitTab[];
  19. extern APTR LibVectors[];
  20. extern char LibName[];
  21. extern char LibId[];
  22.  
  23. Library *LibInit(register __a0 ULONG Segment,register __d0 ClassBase *cb,register __a6 Library *sysbase);
  24. Library *LibOpen(register __a6 ClassBase *cb);
  25. ULONG LibClose(register __a6 ClassBase *cb);
  26. ULONG LibExpunge(register __a6 ClassBase *cb);
  27. IClass *ObtainClass(register __a6 ClassBase *cb);
  28.  
  29. BOOL L_OpenLibs();
  30. void L_CloseLibs();
  31. IClass *InitClass(ClassBase *cb);
  32.  
  33. static LONG LibExtFunc()
  34. {
  35. return -1;
  36. }
  37.  
  38. static Resident RomTag=
  39. {
  40. RTC_MATCHWORD,
  41. &RomTag,
  42. &RomTag+sizeof(RomTag),
  43. RTF_AUTOINIT,
  44. VERSION,
  45. NT_LIBRARY,
  46. 0,
  47. LibName,
  48. LibId,
  49. &InitTab
  50. };
  51.  
  52. char LibName[]="pcd.datatype";
  53. char LibId[]="$VER:pcd.datatype 43.12 (13.11.99) © 1997-99 by Achim Stegemann\n";
  54.  
  55. ULONG InitTab[]=
  56. {
  57. sizeof(ClassBase),
  58. ULONG(LibVectors),
  59. 0,
  60. ULONG(LibInit)
  61. };
  62.  
  63. APTR LibVectors[]=
  64. {
  65. LibOpen,
  66. LibClose,
  67. LibExpunge,
  68. LibExtFunc,
  69. ObtainClass,
  70. APTR(-1),
  71. };
  72.  
  73. Library *SysBase;
  74. Library *DOSBase;
  75. Library *IntuitionBase;
  76. Library *GfxBase;
  77. Library *UtilityBase;
  78. Library *DataTypesBase;
  79. Library *SuperClassBase;
  80. Library *RenderBase;
  81.  
  82. Library *LibInit(register __a0 ULONG Segment,register __d0 ClassBase *cb,register __a6 Library *sysbase)
  83. {
  84. SysBase=sysbase;
  85. cb->lib_Revision=REVISION;
  86. cb->cb_SegList=Segment;
  87. InitSemaphore(&cb->cb_Lock);
  88. return cb;
  89. }
  90.  
  91. Library *LibOpen(register __a6 ClassBase *cb)
  92. {
  93. Library *ret=0;
  94. cb->lib_Flags&=~LIBF_DELEXP;
  95. ObtainSemaphore(&cb->cb_Lock);
  96. if(!cb->cb_Class)
  97.     {
  98.     if(L_OpenLibs())
  99.         {
  100.         if(cb->cb_Class=InitClass(cb)) ret=cb;
  101.         }
  102.     }
  103. else ret=cb;
  104. if(ret) cb->lib_OpenCnt++;
  105. ReleaseSemaphore(&cb->cb_Lock);
  106. return ret;
  107. }
  108.  
  109. ULONG LibClose(register __a6 ClassBase *cb)
  110. {
  111. if(cb->lib_OpenCnt) cb->lib_OpenCnt--;
  112. return (!cb->lib_OpenCnt&&cb->lib_Flags&LIBF_DELEXP)?LibExpunge(cb):0;
  113. }
  114.  
  115. ULONG LibExpunge(register __a6 ClassBase *cb)
  116. {
  117. if(!cb->lib_OpenCnt)
  118.     {
  119.     if(cb->cb_Class) 
  120.         {
  121.         if(!FreeClass(cb->cb_Class))
  122.             {
  123.             AddClass(cb->cb_Class);
  124.             return 0;
  125.             }
  126.         }
  127.     L_CloseLibs();
  128.     Remove(cb);
  129.     FreeMem((BYTE *)cb-cb->lib_NegSize,cb->lib_NegSize+cb->lib_PosSize);
  130.     return cb->cb_SegList;
  131.     }
  132. else cb->lib_Flags|=LIBF_DELEXP;
  133. return 0;
  134. }
  135.  
  136. BOOL L_OpenLibs()
  137. {
  138. if(DOSBase=OpenLibrary("dos.library",39))
  139.     {
  140.     if(GfxBase=OpenLibrary("graphics.library",39))
  141.         {
  142.         if(IntuitionBase=OpenLibrary("intuition.library",39))
  143.             {
  144.             if(UtilityBase=OpenLibrary("utility.library",39))
  145.                 {
  146.                 if(DataTypesBase=OpenLibrary("datatypes.library",39))
  147.                     {
  148.                     if(SuperClassBase=OpenLibrary("datatypes/picture.datatype",39))
  149.                         {
  150.                         if(RenderBase=OpenLibrary("render.library",30)) return 1;
  151.                         }
  152.                     }
  153.                 }
  154.             }
  155.         }
  156.     }
  157. L_CloseLibs();
  158. return 0;
  159. }
  160.  
  161. void L_CloseLibs()
  162. {
  163. CloseLibrary(DOSBase);
  164. CloseLibrary(IntuitionBase);
  165. CloseLibrary(GfxBase);
  166. CloseLibrary(UtilityBase);
  167. CloseLibrary(DataTypesBase);
  168. CloseLibrary(SuperClassBase);
  169. CloseLibrary(RenderBase);
  170. }
  171.  
  172. IClass *InitClass(ClassBase *cb)
  173. {
  174. IClass *cl;
  175. if(cl=MakeClass(LibName,"picture.datatype",0,0,0))
  176.     {
  177.     cl->h_Entry=&HookEntry;
  178.     cl->h_SubEntry=&Dispatcher;
  179.     cl->cl_UserData=ULONG(cb);
  180.     AddClass(cl);
  181.     }
  182. return cl;
  183. }
  184.  
  185. IClass *ObtainClass(register __a6 ClassBase *cb)
  186. {
  187. return cb->cb_Class;
  188. }
  189.  
  190.